home *** CD-ROM | disk | FTP | other *** search
/ boe.pres.k12.wv.us / boe.pres.k12.wv.us.zip / boe.pres.k12.wv.us / Utilities / Xerox Workcentre 5335 / Windows Scan / 64-bit_x64 / Russian / cpsimage.cab / data / xps / XpsResource.elf < prev    next >
Text File  |  2009-04-23  |  12KB  |  364 lines

  1. #import "builtins.ucm";          /* for: GetDataResource */
  2. #import "documentio.ucm";        /* for: XIPXMLtoXPSXML          */
  3.  
  4. #load "docio/xmldocutils.elf";   /* XIPXML_COALESCEWORDS support */
  5.  
  6. #load "xps/Xps.elf";
  7. #load "xps/XpsPackagePart.elf";
  8. #load "xps/XpsAttrs.elf";
  9.  
  10. /******************************************************************************/
  11. CLASS XpsResource EXTENDS XpsPackagePart {
  12.    // Fields
  13.    STRING  id;
  14.    STRING  mimeType;
  15.    STRING  typeUri;
  16.    STRING  ext;
  17.    BOOLEAN shared;
  18.  
  19.    // Methods
  20.    METHOD isShared () RETURNS (BOOLEAN value) {
  21.       value = this.shared;
  22.    }
  23.  
  24.    METHOD setShared (BOOLEAN value) {
  25.       this.shared = value;
  26.    }
  27.  
  28.    METHOD getId () RETURNS (STRING id) {
  29.       id = this.id;
  30.    }
  31.  
  32.    METHOD getMimeType () RETURNS (STRING mimeType) {
  33.       mimeType = this.mimeType;
  34.    }
  35.  
  36.    METHOD getMimeDataType () RETURNS (STRING type) {
  37.       type = this.mimeType.split (delims: "/").ref (entry: 0);
  38.    }
  39.  
  40.    METHOD getMimeDataSubtype () RETURNS (STRING subtype) {
  41.       subtype = this.mimeType.split (delims: "/").ref (entry: 1);
  42.    }
  43.  
  44.    METHOD getTypeUri () RETURNS (STRING typeUri) {
  45.       typeUri = this.typeUri;
  46.    }
  47.  
  48.    METHOD makeUri (INTEGER docNum, INTEGER pgNum) {
  49.    }
  50.  
  51.    METHOD write (STRING filename) {
  52.    }
  53. }
  54.  
  55. /******************************************************************************/
  56. CLASS XpsImage EXTENDS XpsResource {
  57.    // Fields
  58.    XIPIMAGE layer;
  59.    INTEGER  layerNum;
  60.  
  61.    // Methods
  62.    METHOD getMember (STRING member)
  63.      RETURNS (OBJECT obj) {
  64.       obj = this.layer.getMember (num: this.layerNum, member: member);
  65.    }
  66.  
  67.    METHOD makeUri (INTEGER docNum, INTEGER pgNum)
  68.      RETURNS (STRING uri) {
  69.       STRING basename;
  70.  
  71.       if (!this.shared) {
  72.          if ((docNum <= 0) || (pgNum <= 0)) {
  73.             SetStatus (op: "stop", msg: "ArgumentException");
  74.             return;
  75.             }
  76.  
  77.          uri      = Xps.DOCS_PATH + "/" + docNum;
  78.          basename = "Page" + pgNum + "_Layer" + this.layerNum;
  79.          }
  80.       else {
  81.          basename = this.id;
  82.          }
  83.  
  84.       uri = uri + Xps.RESOURCES_PATH + Xps.IMAGES_PATH +
  85.                "/" + basename + "." + this.ext;
  86.    }
  87.  
  88.    METHOD write (STRING filename) {
  89.       LoadClasses (filename: "xeng");
  90.  
  91.       XIPIMAGE imgL  = this.layer.getLayer (num: 0);
  92.       INTEGER  ltype = this.layer.getMember (num: 0,
  93.                           member: "layerType");
  94.       INTEGER  comp  = this.layer.getMember (num: 0,
  95.                           member: "compression");
  96.       FILE dir = new (FILE, path: filename).getParentFile ();
  97.       if (!dir.exists ())
  98.          dir.mkdirs ();
  99.  
  100.       if (ltype == XIP_Contone || comp == XIP_JPEG_COMP) {
  101.          // This handles PDF cascaded compression of Jpeg followed with deflate
  102.          if (comp != XIP_JPEG_COMP)
  103.             imgL = imgL.unCompress ();
  104.  
  105.          if (this.ext.strcasecmp (str: "jpg"))
  106.             imgL.writejpgop (filename: filename);
  107.          else if (this.ext.strcasecmp (str: "wdp"))
  108.             imgL.writehdpop (filename: filename);
  109.          else {
  110.             print "XpsImage: Error, not configured for writing " + this.ext +
  111.                   " file for contone and/or jpeg-compressed layer";
  112.             return;
  113.             }
  114.          }
  115.       else if ( ltype == XIP_ColorMask || ltype == XIP_Binary || ltype == XIP_ContoneMask) {
  116.          if (ltype == XIP_ColorMask || ltype == XIP_ContoneMask) {
  117.             imgL = imgL.unCompress ();
  118.  
  119.             if ( imgL.getMember (member: "photometry") == XIP_K_COLOR )
  120.                imgL = imgL.invert();
  121.  
  122.             imgL = imgL.modheader (modify: ("Photometry:transparency:0"));
  123.             }
  124.          else
  125.             imgL = imgL.unCompress();
  126.  
  127.          /*
  128.          ** For now set the resolution to 0 in order to prevent XPS viewer
  129.          ** from using it
  130.          */
  131.          if (this.ext.strcasecmp (str: "tif"))
  132.             imgL.writetifop (filename: filename, ccitt: 4, noicc:TRUE);
  133.          else if (this.ext.strcasecmp (str: "png"))
  134.             imgL.writepng (filename: filename);
  135.          else {
  136.             print "XpsImage: Error, not configured for writing " + this.ext +
  137.                   " file for binary or mask layer";
  138.             return;
  139.             }
  140.          }
  141.  
  142.       Execute ();
  143.    }
  144. }
  145.  
  146. /******************************************************************************/
  147. CLASS XpsThumbnail EXTENDS XpsResource {
  148.    // Fields
  149.    XIPIMAGE layer;
  150.  
  151.    // Methods
  152.    METHOD makeUri (INTEGER docNum, INTEGER pgNum)
  153.      RETURNS (STRING uri) {
  154.       STRING basename;
  155.  
  156.       if (!this.shared) {
  157.          if ((docNum <= 0) || (pgNum <= 0)) {
  158.             SetStatus (op: "stop", msg: "ArgumentException");
  159.             return;
  160.             }
  161.  
  162.          uri      = Xps.DOCS_PATH + "/" + docNum;
  163.          basename = "Page" + pgNum + "_Thumb";
  164.          }
  165.       else {
  166.          basename = "Package_Thumb";
  167.          }
  168.  
  169.       uri = uri + Xps.METADATA_PATH +
  170.                "/" + basename + "." + this.ext;
  171.    }
  172.  
  173.    METHOD write (STRING filename) {
  174.       LoadClasses (filename: "xeng");
  175.  
  176.       FILE dir = new (FILE, path: filename).getParentFile ();
  177.       if (!dir.exists ())
  178.          dir.mkdirs ();
  179.  
  180.       // The delete was put in place to avoid changing checksums when units
  181.       // were allowed again
  182.       this.layer.modheader (_delete: ("Origin:units")
  183.          ).writejpgop (filename: filename
  184.          );
  185.  
  186.       Execute ();
  187.    }
  188. }
  189.  
  190. /******************************************************************************/
  191. CLASS XpsFont EXTENDS XpsResource {
  192.    // Fields
  193.    STRING basename;
  194.  
  195.    // Methods
  196.    METHOD makeUri (INTEGER docNum, INTEGER pgNum)
  197.      RETURNS (STRING uri) {
  198.       if (!this.shared) {
  199.          if ((docNum <= 0) || (pgNum <= 0)) {
  200.             SetStatus (op: "stop", msg: "ArgumentException");
  201.             return;
  202.             }
  203.  
  204.          uri = Xps.DOCS_PATH + "/" + docNum;
  205.          }
  206.  
  207.       uri = uri + Xps.RESOURCES_PATH + Xps.FONTS_PATH +
  208.                "/" + this.basename + "." + this.ext;
  209.    }
  210.  
  211.    METHOD write (STRING filename) {
  212.       STRING fname = this.basename + "." + this.ext;
  213.       STRING fontPath = GetDataResource (filename: "xps/Fonts/" + fname);
  214.       if (!fontPath) {
  215.          SetStatus (op: "stop", msg: "FileNotFoundException");
  216.          return;
  217.          }
  218.  
  219.       FILE   dir = new (FILE, path: filename).getParentFile ();
  220.       if (!dir.exists ())
  221.          dir.mkdirs ();
  222.  
  223.       System (cmd: "cp " + fontPath + " " + filename);
  224.    }
  225. }
  226.  
  227. /******************************************************************************/
  228. CLASS XpsResourceFactory {
  229.    METHOD createResource (XIPIMAGE img, INTEGER layerNum)
  230.      RETURNS (XpsResource res) {
  231.       INTEGER ltype = img.getMember (num: layerNum, member: "layerType");
  232.       if (ltype == XIP_Text) {
  233.          res = this.createFont (img: img, layerNum: layerNum);
  234.          }
  235.       else if (ltype == XIP_Thumbnail) {
  236.          res = this.createThumbnail (img: img, layerNum: layerNum);
  237.          }
  238.       else if (ltype == XIP_Binary || ltype == XIP_Contone ||
  239.                ltype == XIP_ColorMask || ltype == XIP_ContoneMask) {
  240.          res = this.createImage (img: img, layerNum: layerNum);
  241.          }
  242.    }
  243.  
  244.    METHOD createResources (XIPIMAGE img)
  245.      RETURNS (LIST resources) {
  246.       XpsResource res;
  247.       INTEGER     i;
  248.       for (i = 0; i < img.nlayers; i++) {
  249.          res = this.createResource (img: img, layerNum: i);
  250.          if (res)
  251.             resources.insert (obj: res, entry: resources.length ());
  252.          }
  253.    }
  254.  
  255.    METHOD createImage (XIPIMAGE img, INTEGER layerNum)
  256.      RETURNS (XpsImage image) {
  257.       XIPIMAGE layer = img.getLayer (num: layerNum);
  258.       image.id       = "Image_" + MD5 (obj: layer);
  259.       image.shared   = FALSE;
  260.       image.ext      = this.mapExt (img: img, layerNum: layerNum);
  261.       image.layer    = layer;
  262.       image.layerNum = layerNum.Copy ();
  263.       image.typeUri  = Xps.REQUIRED_RESOURCE_URI;
  264.       image.mimeType = this.mapMimeType (ext: image.ext);
  265.    }
  266.  
  267.    METHOD createThumbnail (XIPIMAGE img, INTEGER layerNum)
  268.      RETURNS (XpsThumbnail thumb) {
  269.       XIPIMAGE layer = img.getLayer (num: layerNum);
  270.       thumb.id       = "Thumbnail" + MD5 (obj: layer);
  271.       thumb.shared   = FALSE;
  272.       thumb.ext      = "jpg";
  273.       thumb.layer    = layer;
  274.       thumb.typeUri  = Xps.RELS_THUMBNAIL_URI;
  275.       thumb.mimeType = this.mapMimeType (ext: thumb.ext);
  276.    }
  277.  
  278.    METHOD createFont (XIPIMAGE img, INTEGER layerNum)
  279.      RETURNS (XpsFont font) {
  280.       DOUBLE fx = 96 / img.resolution[0];
  281.       DOUBLE fy = 96 / img.resolution[1];
  282.  
  283.       XIPIMAGE layer  = img.getLayer (num: layerNum);
  284.       INTEGER  txtfmt = layer.getMember (member: "textformat");
  285.       if (txtfmt != XIP_XML_TEXT) {
  286.          print "Invalid text layer format type to include in XPS";
  287.          continue;
  288.          }
  289.  
  290.       STRING xipocr = layer.getMember(member:"text");
  291.       STRING ocrxml, filename;
  292.       if (img.getAttr (name: "XpsAttrs").doCoalesce) {
  293.          /* May need to override the default tolerences some day */
  294.          xipocr = XIPXML_COALESCEWORDS.format (xipxml: xipocr);
  295.          }
  296.  
  297.       DOUBLE xpos   = layer.getMember (member: "xpos")   * fx;
  298.       DOUBLE ypos   = layer.getMember (member: "ypos")   * fy;
  299.       DOUBLE width  = layer.getMember (member: "width")  * fx;
  300.       DOUBLE height = layer.getMember (member: "height") * fy;
  301.       DOUBLE xres   = layer.getMember (member: "xres");
  302.       DOUBLE yres   = layer.getMember (member: "yres");
  303.       LIST   xform  = layer.getAttr (name: "_DIOMatrixTransform", num: 0);
  304.       LIST   coeffs;
  305.       if (!xform)
  306.          coeffs = (1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
  307.       else {
  308.          TRANSFORM2D matrix;
  309.          matrix.setCoeffs (coeffs: xform);
  310.          coeffs = matrix.getCoeffs ();
  311.          coeffs[4] *= fx;
  312.          coeffs[5] *= fy;
  313.          }
  314.  
  315.       XIPXMLtoXPSXML (xipxml: xipocr, width: width, height: height,
  316.                       xres: xres, yres: yres, matrix: coeffs)
  317.          Returns (xpsxml: ocrxml, font: filename);
  318.  
  319.       img.setAttr (name: "XpsGlyphs", obj: ocrxml);
  320.  
  321.       STRING fontPath = GetDataResource (filename: "xps/Fonts/" + filename);
  322.       font.id         = "Font" + MD5 (filename: fontPath);
  323.       font.shared     = TRUE;
  324.       font.typeUri    = Xps.REQUIRED_RESOURCE_URI;
  325.       font.ext        = filename.ext ();
  326.  
  327.       font.basename   = filename.basename ();
  328.       INTEGER len     = font.basename.length () - font.ext.length () - 1;
  329.       font.basename   = font.basename.substring (start: 0, run: len);
  330.  
  331.       if (font.ext.strcasecmp (str: "ttf"))
  332.          font.mimeType = Xps.TTF_TYPE;
  333.       else
  334.          font.mimeType = Xps.ODTTF_TYPE;
  335.    }
  336.  
  337.    METHOD mapMimeType (STRING ext)
  338.      RETURNS (STRING mimeType) {
  339.       if (ext.strcasecmp (str: "jpg"))
  340.          mimeType = Xps.JPEG_TYPE;
  341.       else if (ext.strcasecmp (str: "tif"))
  342.          mimeType = Xps.TIFF_TYPE;
  343.       else
  344.          mimeType = Xps.PNG_TYPE;
  345.    }
  346.  
  347.    METHOD mapExt (XIPIMAGE img, INTEGER layerNum)
  348.      RETURNS (STRING ext) {
  349.       INTEGER ltype = img.getMember (num: layerNum, member: "layerType");
  350.       INTEGER comp  = img.getMember (num: layerNum, member: "compression");
  351.  
  352.       if (ltype == XIP_Contone || comp == XIP_JPEG_COMP) {
  353.          ext = "jpg";
  354.          if (img.getAttr (name: "XpsAttrs").isJPEGXR)
  355.             ext = "wdp";
  356.          }
  357.       else {
  358.          ext = "png";
  359.          if (img.getAttr (name: "XpsAttrs").isTIFF && ltype != XIP_ColorMask)
  360.             ext = "tif";
  361.          }
  362.    }
  363. }
  364.